CC = cc
LEX = flex
YACC = bison
CFLAGS = -Wall
HFILES = noise.h cache.h random.h functions.h voronoi.h symtab.h expr.h runtime.h
OFILES = noise.o cache.o random.o functions.o voronoi.o symtab.o expr.o expr_parser.o expr_lexer.o runtime.o
ARCH = -arch i386 -arch x86_64 -arch ppc -arch ppc64

build: libpcg.a

install: build
	mkdir -p /usr/local/include/openpcg
	cp *.h /usr/local/include/openpcg/
	cp libpcg.a /usr/local/lib/

libpcg.a: openpcg.h $(OFILES)
	rm -f libpcg.a
	ar rc libpcg.a *.o
	ranlib libpcg.a

expr_lexer.o: expr_lexer.c
	$(CC) $(ARCH) -c $(CFLAGS) -o $@ $<

expr_lexer.c: expr_lexer.l
	$(LEX) --prefix=pcg_ --header-file=expr_lexer.h --outfile=expr_lexer.c expr_lexer.l
	
expr_parser.o: expr_parser.c
	$(CC) $(ARCH) -c $(CFLAGS) -o $@ $<
	
expr_parser.c: expr_parser.y
	$(YACC) -d --name-prefix=pcg_ --output-file=expr_parser.c expr_parser.y

%.o: %.c %.h
	$(CC) $(ARCH) -c $(CFLAGS) -o $@ $<
	
scanner: expr_lexer.l
	$(LEX) --prefix=pcg --outfile=expr_lexer.c expr.l
	$(YACC) -d --name-prefix=pcg --file-prefix=expr_parser expr.y

#%:
#	$(CC) -DUNIT_TEST -DUNIT_TEST_FILE=\"$@\" *.c -o _unit_test
#	./_unit_test

docs: $(HFILES)
	headerdoc2html -o docs $(HFILES)
	gatherheaderdoc "docs"
	cpp -P -C openpcg.h openpcg_unify.h

all: libpcg.a docs

clean:
	rm -f *.o
	rm -f libpcg.a
	rm -rf docs
	rm -f openpcg_unify.h
	rm -f expr_parser.c
	rm -f expr_parser.h
	rm -f expr_lexer.c
